package com.atguigu.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 *  1.整合MyBatis-Plus
 *      1) 导入依赖
 *      <dependency>
 *             <groupId>com.baomidou</groupId>
 *             <artifactId>mybatis-plus-boot-starter</artifactId>
 *             <version>3.5.1</version>
 *       </dependency>
 *      2) 配置
 *          1、配置数据源
 *              1)导入数据库驱动
 *              2)在application.yml配置相关信息
 *          2、配置mybatis-plus
 *              1)使用@mapperScan
 *              2)告诉mybatis-plus sql的映射文件位置
 *  2、逻辑删除
 *      1)、配置全局的逻辑的删除规则(省略)
 *      2)、配置逻辑删除的组件bean(省略)
 *  3、JSR303
 *     1)、给bean添加检验注解 在包路径：javax.validation.constraints 并且定义自己的message提示
 *     2)、开启校验功能 @Valid
 *          效果：检验错误以后会有默认的相应
 *     3)、给校验的bean后紧跟一个bindingResult ,就可以获取到检验的结果
 *     4)、分组校验
 *          1）@NotBlank(message = "品牌名不能为空",groups = {AddGroup.class,UpdateGroup.class})
 *          给校验注解标注什么情况需要进行校验
 *          2）@Validated(value = {AddGroup.class}
 *          3)默认没有指定的校验注解
 *    5)、自定义注解
 *      1）、 编写一个自定义的注解
 *      2）、编写一个自定义的校验器
 *      3）、关联自定义校验器跟自定义的校验注解
 *          @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
 *          @Retention(RetentionPolicy.RUNTIME)
 *          @Documented
 *          @Constraint(
 *              validatedBy = {
 *                 ListValueConstraintValidator.class//指定校验器 多个校验器逗号隔开
 *              }
 *          )
 *  4、统一的异常处理
 *      @RestControllerAdvice
 *    1) 编写异常处理类 使用  @RestControllerAdvice
 *    2) 使用@ExceptionHandler(value = MethodArgumentNotValidException.class)标注方法可以处理的异常
 *
 *  5、引入模板引擎
 *    1）thymeleaf-starter 关闭缓存
 *    2）静态资源放在static文件下就可以按照路径直接访问
 *    3）页面访问放在templates下，直接访问
 *       因为spring boot已经默认配置好index.html 是在WebMvcAutoConfiguration配置的
 *    4）页面修改不重启服务器实时更新
 *      1）、引入dev-tools工具
 *      2）、页面刷新可以使用cmd+f9
 *  6、整合redis
 *      1)、引入data-redis-start
 *      2)、简单配置redis的host等信息
 *      3）、使用springboot 自动配置好的StringRedisTemplate操作redis
 *  7、引入redisson 作为分布式锁的等功能的依赖
 *      1、引入依赖
 *      <dependency>
 * 			<groupId>org.redisson</groupId>
 * 			<artifactId>redisson</artifactId>
 * 			<version>3.17.0</version>
 * 		</dependency>
 * 	    2、配置reddsion
 *
 *   8、整合springcache 简化缓存开发
 *      1）引入依赖
 *          spring-boot-starter-cache、spring-boot-starter-data-redis
 *      2) 写配置
 *          (1)、自动配置了哪些
 *              CacheAutoConfiguration会导入RedisCacheConfiguration
 *              自动配置好了缓存管理器RedisCacheManage
 *          (2)、配置使用redis作为缓存
 *              spring.cache.type=redis
 *      3) 测试使用缓存
 *          1) 开启缓存EnableCaching
 *          2) 只需要使用注解就能完成缓存操作
 *      4) 原理：
 *          CacheAutoConfiguration-->RedisCacheConfiguration -->
 *          自动配置了RedisCacheManager-->初始化所有缓存-->每个缓存决定使用什么配置
 *          -->如果RedisCacheConfiguration有就使用已有的，没有使用默认的，
 *          想改缓存的配置，只需要给容器中放一个RedisCacheConfiguration即可，就会应用到当前redisCacheManager 管理所有缓存
 *
 *
 */

@EnableRedisHttpSession
@EnableCaching
@EnableFeignClients(basePackages = "com.atguigu.gulimall.product.feign") //spring扫描feign接口
@EnableDiscoveryClient
@SpringBootApplication
@MapperScan("com.atguigu.gulimall.product.dao")
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
